home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Demos / Extend 3.0 Demo / Demo Libraries / Demo Custom Blocks Lib / Demo Custom Blocks Lib.rsrc / MODL_2109_Planet < prev    next >
Encoding:
Text File  |  1994-06-22  |  3.9 KB  |  230 lines

  1. Integer force1, force2, planet1Con, planet2Con, planet3Con;
  2. Real    VectorX, VectorY, DistanceX, DistanceY, XFactor, YFactor;
  3. Real    Distance, Gee, force;
  4. real    XArray[4], YArray[4];
  5.  
  6. real    me[], planet1[], planet2[], planet3[];
  7.  
  8. **     Planet block
  9. **    Copyright © 1993 by Imagine That, Inc.
  10. **    All rights reserved.
  11. **        J. Steven Lamperti 3/10/93
  12. **            modified
  13. **
  14.  
  15. //  planet array elements
  16. //
  17. //  me[0] = mass;
  18. //  me[1] = x;
  19. //  me[2] = y;
  20. //  me[3] = planetID;
  21. //  me[4] = density;
  22.  
  23.  
  24. integer planetID()
  25. {
  26.     if (earth)
  27.         return(1);
  28.     else if (mars)
  29.         return(2);
  30.     else if (venus)
  31.         return(3);
  32.     else if (moon)
  33.         return(4);
  34.     else if (sun)
  35.         return(5);
  36.  
  37.     return(4);
  38. }
  39.  
  40.  
  41. Procedure calc()
  42. {
  43. if (Distance < Mass/Density)
  44.     {
  45.     userError("Interplanetary Collision!  Block:"+(myBlockNumber()+1)+".");
  46.     Abort;
  47.     }
  48.  
  49. if (DistanceX != 0.0)
  50.     {
  51.     Xfactor = (DistanceY^2)/(DistanceX^2)+1.0;
  52.     Xfactor = (Gee^2) / Xfactor;
  53.     Xfactor = sqrt(Xfactor);
  54.     if (DistanceX>0.0)
  55.         Xfactor = -Xfactor;
  56.     }
  57.  
  58. if (DistanceY != 0.0)
  59.     {
  60.     Yfactor = (DistanceX^2)/(DistanceY^2)+1.0;
  61.     Yfactor = (Gee^2) / Yfactor;
  62.     Yfactor = sqrt(Yfactor);
  63.     if (DistanceY>0.0)
  64.            Yfactor = -Yfactor;
  65.     }
  66. }
  67.  
  68.  
  69. ** This message occurs for each step in the simulation.
  70.  
  71. on simulate
  72. {
  73.     if ( CurrentStep !=0)
  74.         {
  75.         VectorX = 0.0;
  76.         VectorY = 0.0;
  77.         if (planet1Con)
  78.             {
  79.             GetPassedArray(planet1In, planet1);
  80.             DistanceX = (me[1]-planet1[1]);
  81.             DistanceY = (me[2]-planet1[2]);
  82.             Distance = sqrt(DistanceX^2+DistanceY^2);
  83.             Force = planet1[0]/(Distance^2);
  84.             Gee = Force/Mass;
  85.             Calc();
  86.             VectorX = XFactor;
  87.             VectorY = YFactor;
  88.             }
  89.  
  90.         if (planet2Con)
  91.             {
  92.             GetPassedArray(planet2In, planet2);
  93.             DistanceX = (me[1]-planet2[1]);
  94.             DistanceY = (me[2]-planet2[2]);
  95.             Distance = sqrt(DistanceX^2+DistanceY^2);
  96.             Force = planet2[0]/(Distance^2);
  97.             Gee = Force/Mass;
  98.             Calc();
  99.             VectorX += XFactor;
  100.             VectorY += YFactor;
  101.             }
  102.  
  103.         if (planet3Con)
  104.             {
  105.             GetPassedArray(planet3In, planet3);
  106.             DistanceX = (me[1]-planet3[1]);
  107.             DistanceY = (me[2]-planet3[2]);
  108.             Distance = sqrt(DistanceX^2+DistanceY^2);
  109.             Force = planet3[0]/(Distance^2);
  110.             Gee = Force/Mass;
  111.             Calc();
  112.             VectorX += XFactor;
  113.             VectorY += YFactor;
  114.             }
  115.  
  116.         me[1] += IntegrateEuler(Xarray, VectorX, DeltaTime)*DeltaTime;
  117.         me[2] += IntegrateEuler(Yarray, VectorY, DeltaTime)*DeltaTime;
  118.         }
  119.  
  120.     meOut = passArray(me);
  121. }
  122.  
  123.  
  124.  
  125. ** If the dialog data is inconsistent for simulation, abort.
  126. on checkdata
  127. {
  128.     if (Mass == 0.0 || NoValue(Mass)) 
  129.         {
  130.         userError("Mass is missing, or zero.");
  131.         Abort;
  132.         }
  133.  
  134.     if (Density == 0.0 || NoValue(Density)) 
  135.         {
  136.         userError("Density is missing, or zero.");
  137.         Abort;
  138.         }
  139.  
  140.     if (NoValue(StartX) || NoValue(StartY))
  141.         {
  142.         userError("You must input starting Coordinates.");
  143.         Abort;
  144.         }
  145.  
  146.     planet1Con = planet1In;
  147.     planet2Con = planet2In;
  148.     planet3Con = planet3In;
  149.     
  150.     makeArray(me, 5);
  151. }
  152.  
  153.  
  154.  
  155. ** Initialize any simulation variables.
  156. on initsim
  157. {
  158.     if (NoValue(DeltaX)) DeltaX = 0.0;
  159.     if (NoValue(DeltaY)) DeltaY = 0.0;
  160.     
  161.     VectorX = 0.0;
  162.     VectorY = 0.0;
  163.     
  164.     XFactor = 0.0;
  165.     YFactor = 0.0;
  166.     
  167.     DistanceX = 0.0;
  168.     DistanceY = 0.0;
  169.     
  170.     Distance = 0.0;
  171.     
  172.     IntegrateInit(Xarray, DeltaX);
  173.     IntegrateInit(Yarray, DeltaY);
  174.     
  175.     me[0] = mass;
  176.     me[1] = startX;
  177.     me[2] = startY;
  178.     me[3] = planetID();
  179.     me[4] = Density;
  180. }
  181.  
  182.  
  183. on createBlock
  184. {
  185.     makeArray(me, 5);
  186.  
  187.     AnimationPicture(1, "Moon", TRUE);
  188.     AnimationShow(1);
  189.  
  190.     density = 1;
  191.     mass    = 5;
  192.     startX  = 0;
  193.     startY  = 0;
  194.     deltaX  = 0;
  195.     deltaY  = 0;
  196.     moon    = 1;
  197.     
  198.     me[0] = mass;
  199.     me[1] = startX;
  200.     me[2] = startY;
  201.     me[3] = planetID();
  202.     me[4] = Density;
  203. }
  204.  
  205.  
  206. on DialogClose
  207. {
  208.     makeArray(me, 5);
  209.  
  210.     me[0] = mass;
  211.     me[1] = startX;
  212.     me[2] = startY;
  213.     me[3] = planetID();
  214.     me[4] = Density;
  215.  
  216.     if (moon)
  217.         AnimationPicture(1, "Moon", TRUE);
  218.     else if (sun)
  219.         AnimationPicture(1, "Sun", TRUE);
  220.     else if (earth)
  221.         AnimationPicture(1, "Earth", TRUE);
  222.     else if (mars)
  223.         AnimationPicture(1, "Mars", TRUE);
  224.     else if (venus)
  225.         AnimationPicture(1, "Venus", TRUE);
  226.     else
  227.         AnimationPicture(1, "Moon", TRUE);
  228.         
  229.     AnimationShow(1);
  230. }